package com.zx.crowdfunding.mvc.handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.zx.crowdfunding.entity.Menu;
import com.zx.crowdfunding.global.CrowdFundingGlobal;
import com.zx.crowdfunding.service.api.MenuService;
import com.zx.crowdfunding.service.api.SessionService;
import com.zx.crowdfunding.util.ResultEntity;

/**
 * 菜单 - Handler
 * @author 郑雪
 * @date 2021-12-09
 */
@RestController
public class MenuHandler {

	/**
	 * 菜单Service接口
	 */
	@Autowired
	private MenuService menuService;
	
	/**
	 * 会话Service接口
	 */
	@Autowired
	private SessionService sessionService;
	
	/**
	 * 查询菜单树形结构
	 * @return JSON数据
	 */
	@RequestMapping("/menu/get/tree.json")
	public ResultEntity<List<Menu>> getTree(){
		
		// 1.查询全部的Menu对象
		List<Menu> list = menuService.getAll();
		
		// 2.声明一个Map，key是Menu对象的id，value是Menu对象
		Map<Integer, Menu> menuMap = new HashMap<>();
		
		// 3.声明一个要返回的树形结构列表
		List<Menu> tree = new ArrayList<>();
		
		// 4.遍历list
		for (Menu menu : list) {
			
			// 5.给menuMap添加key和value
			menuMap.put(menu.getId(), menu);
			
			// 打开菜单
			menu.setOpen(true);
		}
		
		// 6.再次遍历list
		for (Menu menu : list) {
			
			// 7.检查pid是否为null，如果为null则为根节点
			if(menu.getPid() == null){
				
				// 8.将根节点放入tree中
				tree.add(menu);
				
			} else {
				
				// 9.给当前节点的父节点添加子节点
				menuMap.get(menu.getPid()).getChildren().add(menu);
			}
		}
		
		// 返回JSON数据
		return ResultEntity.successWithData(tree);
	}
	
	/**
	 * 添加菜单
	 * @param menu 菜单对象
	 * @return JSON数据
	 */
	@RequestMapping("/menu/save.json")
	public ResultEntity<String> save(Menu menu){
		
		// 执行添加
		menuService.saveMenu(menu);
		
		// 更新会话中的管理员菜单集合
		sessionService.editSessionForAddMenu(menu);
		
		// 返回JSON数据
		return ResultEntity.successWithoutData();
	}
	
	/**
	 * 修改菜单
	 * @param menu 菜单对象
	 * @return JSON数据
	 */
	@RequestMapping("/menu/edit.json")
	public ResultEntity<String> edit(Menu menu){
		
		// 执行修改
		menuService.editMenu(menu);
		
		// 设置全局静态变量需要更新，为了通知SpringSecurity的权限授权数据源下次使用时需重新加载
		CrowdFundingGlobal.UPDATE_RESOURCE_AUTH = true;
		
		// 更新会话中的管理员菜单集合
		sessionService.editSessionForEditMenu(menu);
		
		// 返回JSON数据
		return ResultEntity.successWithoutData();
	}
	
	/**
	 * 删除菜单
	 * @param idList 菜单id的List集合
	 * @return JSON数据
	 */
	@RequestMapping("/menu/remove.json")
	public ResultEntity<String> remove(@RequestBody List<Integer> idList){
		
		// 执行删除
		menuService.removeMenu(idList);
		
		// 更新会话中的管理员菜单集合
		sessionService.editSessionForDeleteMenu(idList);
		
		// 返回JSON数据
		return ResultEntity.successWithoutData();
	}
}
